/**
 * Copyright 2018-2019 jianggujin (www.jianggujin.com).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.jianggujin.modulelink.module;

import java.util.Collection;
import java.util.Set;

import com.jianggujin.modulelink.action.JActionWrapper;
import com.jianggujin.modulelink.config.JModuleConfig;
import com.jianggujin.modulelink.exception.JActionNotFoundException;

/**
 * 模块接口
 *
 */
public interface JModule<C extends JModuleConfig> extends JLifeCycleModule, JInvocableModule {

    /**
     * 获取全部的Action名称
     * 
     * @return 全部的Action名称
     */
    Set<String> getActionNames();

    /**
     * 获取全部的Action
     * 
     * @return 全部的Action
     */
    Collection<JActionWrapper> getActionWrappers();

    /**
     * 获取全部的Action
     * 
     * @return 全部的Action
     */
    Collection<Object> getActions();

    /**
     * 获取默认的Action名称
     * 
     * @return 默认的Action名称
     * @throws JActionNotFoundException 未找到Action异常
     */
    String getDefaultActionName();

    /**
     * 获得默认的Action
     * 
     * @return 默认的Action
     */
    Object getDefaultAction();

    /**
     * 获得默认的Action
     * 
     * @return 默认的Action
     */
    JActionWrapper getDefaultActionWrapper();

    /**
     * 获得默认的Action
     * 
     * @return 默认的Action
     */
    <T> T getDefaultAction(Class<T> clazz);

    /**
     * 获取默认的Action名称
     * 
     * @return 不存在默认名称返回null
     */
    String optDefaultActionName();

    /**
     * 获得默认的Action
     * 
     * @return 默认的Action，不存在则返回null
     */
    Object optDefaultAction();

    /**
     * 获得默认的Action
     * 
     * @return 默认的Action，不存在则返回null
     */
    JActionWrapper optDefaultActionWrapper();

    /**
     * 获得默认的Action
     * 
     * @return 默认的Action，不存在则返回null
     */
    <T> T optDefaultAction(Class<T> clazz);

    /**
     * 通过名称获得Action
     * 
     * @param name action名称
     * @return Action
     * @throws JActionNotFoundException 未找到Action异常
     */
    Object getAction(String name);

    /**
     * 通过名称获得Action
     * 
     * @param name action名称
     * @return Action
     * @throws JActionNotFoundException 未找到Action异常
     */
    JActionWrapper getActionWrapper(String name);

    /**
     * 通过名称获得Action
     * 
     * @param name  action名称
     * @param clazz action类型
     * @return Action
     * @throws JActionNotFoundException 未找到Action异常
     */
    <T> T getAction(String name, Class<T> clazz);

    /**
     * 通过名称获得Action
     * 
     * @param name action名称
     * @return 不存在则返回null
     */
    Object optAction(String name);

    /**
     * 通过名称获得Action
     * 
     * @param name action名称
     * @return 不存在则返回null
     */
    JActionWrapper optActionWrapper(String name);

    /**
     * 通过名称获得Action
     * 
     * @param name  action名称
     * @param clazz action类型
     * @return 不存在则返回null
     */
    <T> T optAction(String name, Class<T> clazz);

    /**
     * 是否存在Action
     * 
     * @param name action名称
     * @return 存在则返回true
     */
    boolean hasAction(String name);

    /**
     * 是否有默认Action
     * 
     * @return 存在着而返回true
     */
    boolean hasDefaultAction();

    /**
     * 获取模块配置
     *
     * @return 模块配置
     */
    JModuleConfig getModuleConfig();

    /**
     * 获得模块类加载器
     * 
     * @return 模块类加载器
     */
    ClassLoader getModuleClassLoader();
}
